package logica.locacao;

import logica.util.Constantes;
import logica.veiculo.Estado;

/**
 * Especifica as coberturas possiveis, bem como as porcentagens de cobertura.
 * @see logica.Cobertura Cobertura
 * @author Guilherme Santos G. Baptista em 09/10/2010
 */

public class Seguro {
	
	private Cobertura cobertura;
	private int porcentagem;
	
	/**
	 * Construtor de Seguro.
	 * @param cobertura Cobertura - O tipo de cobertura fornecida pelo seguro.
	 * @param porcentagem int - A porcentagem para a cobertura especificada.
	 * @throws Exception Excecao caso os parametros de entrada sejam invalidos.
	 */
	public Seguro(Cobertura cobertura, int porcentagem) throws Exception{
		if ( cobertura == null ){
			throw new Exception( "Cobertura invalida!" );
		}
		this.cobertura = cobertura;
		if ( porcentagem <= Constantes.MINIMO_PORCENTAGEM_SEGURO || porcentagem > Constantes.MAXIMO_PORCENTAGEM_SEGURO ){
			throw new Exception( "Porcentagem invalida!" );
		}
		this.porcentagem = porcentagem;
	}
	
	/**
	 * Retorna um enum representando qual a cobertura que o seguro oferece.
	 * @return Cobertura - A cobertura oferecida pelo seguro
	 */
	public Cobertura getCobertura(){
		return this.cobertura;
	}
	
	/**
	 * Determina uma cobertura especifica para o seguro.
	 * @param cobertura Cobertura - A nova cobertura a ser determinada
	 * @throws Exception Excecao caso essa cobertura seja invalida
	 */
	public void setCobertura(Cobertura cobertura) throws Exception{
		if ( cobertura == null ){
			throw new Exception( "Cobertura invalida!" );
		}
		this.cobertura = cobertura;
	}
	
	/**
	 * Retorna todos os estados cobertos pelo seguro.
	 * @return Estado[] - Array de enums Estado correspondente aos estados cobertos pelo seguro.
	 */
	public Estado[] getEstadosCobertos(){
		return this.cobertura.getEstadosCobertos();
	}
	
	/**
	 * Verifica se o seguro cobre um determinado estado.
	 * @param estado Estado - O estado a ser verificado
	 * @return <i>true</i> se o seguro cobre esse estado, <i>false</i> caso contrario
	 */
	public boolean cobre(Estado estado){
		return this.cobertura.cobre(estado);
	}
	
	/**
	 * Retorna um inteiro representando a porcentagem de cobertura que o seguro oferece.
	 * @return int - A porcentagem de cobertura do seguro
	 */
	public int getPorcentagem(){
		return this.porcentagem;
	}
	
	/**
	 * Determina uma nova porcentagem de cobertura para o seguro
	 * @param porcentagem int - A nova porcentagem a ser determinada
	 * @throws Exception Excecao caso essa porcentagem seja invalida
	 */
	public void setPorcentagem(int porcentagem) throws Exception{
		if ( porcentagem <= Constantes.MINIMO_PORCENTAGEM_SEGURO || porcentagem > Constantes.MAXIMO_PORCENTAGEM_SEGURO ){
			throw new Exception( "Porcentagem invalida!" );
		}
		this.porcentagem = porcentagem;
	}
	
	/**
	 * Retorna uma string que representa esse Seguro.
	 */
	@Override
	public String toString(){
		StringBuilder retorno = new StringBuilder();
		retorno.append(this.getCobertura() + " - (" + this.getPorcentagem() + "%):<");
		for (int i=0; i<this.getEstadosCobertos().length; i++ ){
			retorno.append(this.getEstadosCobertos()[i]);
			if ( (i+1) < this.getEstadosCobertos().length ){
				retorno.append(", ");
			}
			else{
				retorno.append(">");
			}
		}
		return retorno.toString();
	}
}